package medOffice.dao;

import java.io.Serializable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import medOffice.Representante;


/**
 * Classe que inicializa o banco de dados do representante.
 * @author Tiago Leite - tiagohsl@lcc.ufcg.edu.br
 * @version 1.0 </br> 02/12/09
 *
 */
public class RepresentanteDAO implements Serializable{

	private static final long serialVersionUID = 3805232079404956974L;
	protected Connection conexao;
	
	/**
	 * Construtor default da classe.
	 */
	public RepresentanteDAO() {
		conexao = ConnectionFactory.getConnection();
		procedimento();

	}
	
	/**
	 * Construtor da classe
	 * @param Connection conexao
	 */
	public RepresentanteDAO(Connection conexao){
		this.conexao = conexao;
		procedimento();
	}
	
	/**
	 * Metodo que cria a tabela caso nao exista
	 * e realiza a connexao com o BD
	 */
	private void procedimento(){
		
		PreparedStatement stmt;
		
		String sql = 
			"create table if not exists Representante(nome varchar(50), id integer primary key, tempoLimite integer," + 
			"firmaRepresentada varchar(40),telefone varchar(25),ultimaVisita date)";

		try {
			stmt = conexao.prepareStatement(sql);
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	/**
	 * Metodo void que cria seta os dados de um representante no banco de dados.
	 * @param Representante
	 * @throws Exception Lacada caso os dados passados nao sejam compativeis com os
	 * do banco de dados.
	 */
	public void create(Representante rep) throws Exception {
		String sql = "insert into Representante(nome, id,"
				+ " tempoLimite, firmaRepresentada, telefone, ultimaVisita)"
				+ " values (?,?,?,?,?,?)";

		PreparedStatement stmt = conexao.prepareStatement(sql);

		stmt.setString(1, rep.getNome());
		stmt.setInt(2, rep.getId());
		stmt.setInt(3, rep.getTempoLimite());
		stmt.setString(4, rep.getFirmaQueRepresenta());
		stmt.setString(5, rep.getTelefone());
		java.util.Date dataUtil = rep.getUltimaDataDeVisita().getTime();
		java.sql.Date dataSql = new java.sql.Date(dataUtil.getTime());
		stmt.setDate(6, dataSql);

		stmt.execute();
		stmt.close();
	}
	
	/**
	 * Metodo que fecha uma conexao com o banco de dados.
	 * @throws Exception
	 */
	public void closeConnection() throws Exception {
		conexao.close();
	}
	
	/**
	 * Metodo que recupera os dados de todos os representantes.
	 * @throws SQLException
	 */
	public void recuperaDadosRepresentante() throws SQLException {
		List<Representante> representantes = getListaRepresentantes();
		
		for(Representante rep: representantes){
			System.out.println("Nome: " + rep.getNome() + " | Telefone: "
					+ rep.getTelefone() + " | Firma: " + rep.getFirmaQueRepresenta() + " | "
					+ "Ultima visita em: " + new SimpleDateFormat("dd-MM-yyyy").
					format(rep.getUltimaDataDeVisita().getTime()));
		}
		System.out.println(representantes.size());

		
	}
	
	/**
	 * Metodo que atualiza o nome de um dado representante.
	 * @param String nome
	 * @param String novoNome
	 * @throws SQLException
	 */
	public void update(String nome, String novoNome) throws SQLException {

		String sql = "update Representante set nome=(?) where nome=(?)";
		PreparedStatement stmt = conexao.prepareStatement(sql);

		stmt.setString(1, novoNome);
		stmt.setString(2, nome);

		stmt.execute();
		stmt.close();

	}
	
	/**
	 * Metodo que atualiza os dados de um Representante.
	 * @param Representante representante
	 * @throws SQLException
	 */
	public void editaRepresentante(int idAnterior, Representante representante) throws SQLException {		
		String sql = "update Representante set nome=?, id=?, tempoLimite=?," +
				"firmaRepresentada=?, telefone=?, ultimaVisita=? where id=?";
		
		PreparedStatement stmt = conexao.prepareStatement(sql);
		stmt.setString(1, representante.getNome());
		stmt.setInt(2, representante.getId());
		stmt.setInt(3, representante.getTempoLimite());
		stmt.setString(4, representante.getFirmaQueRepresenta());
		stmt.setString(5, representante.getTelefone());
		java.util.Date dataUtil = representante.getUltimaDataDeVisita().getTime();
		java.sql.Date dataSql = new java.sql.Date(dataUtil.getTime());
		stmt.setDate(6, dataSql);
		stmt.setInt(7, idAnterior);
		
		stmt.executeUpdate();
		
	}
	
	/**
	 * Metodo que deleta um representante na clinica.
	 * @param Integer codigo do representante
	 * @throws SQLException
	 */
	public void delete(int id) throws SQLException {
		String sql = "delete from Representante where id=(?)";
		PreparedStatement stmt = conexao.prepareStatement(sql);

		stmt.setInt(1, id);
		
		stmt.execute();
		stmt.close();
	}
	
	/**
	 * Metodo acessador que retorna a lista de representantes.
	 * @return List<Representante> lista de representantes.
	 * @throws SQLException 
	 */
	public List<Representante> getListaRepresentantes() throws SQLException {
		PreparedStatement stmt = conexao.prepareStatement("select * from Representante ORDER BY nome");

		ResultSet rs = stmt.executeQuery();
		
		return convertePesquisaEmLista(rs);
		
	}
	
	/**
	 * Metodo que recebe uma pequisa em banco de dados
	 * e retorna uma lista de representantes
	 * @param ResultSet rs
	 * @return List<Representante>
	 * @throws SQLException
	 */
	public List<Representante> convertePesquisaEmLista(ResultSet rs) throws SQLException{
		List<Representante> representantes = new ArrayList<Representante>();
		
		while (rs.next()) {
			try {
				Representante representanteTemp = new Representante(rs.getString("nome"));
				representanteTemp.setId(rs.getInt("id"));
				representanteTemp.setTempoLimite(rs.getInt("tempoLimite"));
				representanteTemp.setFirmaQueRepresenta(rs.getString("firmaRepresentada"));
				if(rs.getString("telefone") != null){
					representanteTemp.setTelefone(rs.getString("telefone"));
				}
				String dataSQL = rs.getDate(6).toString();
				representanteTemp.setUltimaDataDeVisita(PacienteDAO.conversorData(dataSQL));   
				if (!representantes.contains(representanteTemp)) {
					representantes.add(representanteTemp);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		
			
		}
		
		rs.close();
		return representantes;
	}

}
